#include <iostream>
#include <signal.h>
#include <unistd.h>

using namespace std;

void PrintPending(sigset_t pending)
{
    for (int i = 1; i <= 31; i++)
    {
        cout << sigismember(&pending, i);
    }
    cout << endl;
}

void handler(int signo)
{
    cout << "catch signal " << signo << endl;
}

int main()
{
    // 4. 捕捉2号信号，设置自定义动作
    signal(2, handler);

    // 1.准备 sigset_t 变量
    sigset_t oldset, set;
    sigemptyset(&set);
    sigemptyset(&oldset);
    sigaddset(&set, 2); //  在set位图中添加2号信号，注意这里2号信号还没有屏蔽，还没有被设置进task_struct中
    // 2 对2号信号进行屏蔽
    sigprocmask(SIG_BLOCK, &set, &oldset); //  这时我们就已经屏蔽了2号信号了

    // 3. 重复打印当前进程的pending
    sigset_t pending;
    int cnt = 10;
    while (1)
    {
        int n = sigpending(&pending); // 获取pending表
        if (n < 0)
            continue;
        PrintPending(pending); // 打印pending表
        sleep(1);
        cnt--;
        if (cnt == 0)
        {
            // set位图中2号信号位置的bit设置回0
            sigaddset(&set, 2);                      // 这里这步可以省略，因为set为位图中2号位已经为1了，这里只是为了演示的完整性
            sigprocmask(SIG_UNBLOCK, &set, &oldset); // 将set位图设置进task_struct中，2号信号的屏蔽状态恢复
        }
    }

    return 0;
}